package com.company.section4;

import java.util.Observable;
import java.util.Observer;
import java.util.Vector;

/**
 * 代码清单36-5 事件的观察者
 *
 * 中介者 3个职责：
 *   1.事件的观察者
 *   2.事件分发者
 *   3.事件处理者的管理员角色
 */
public class EventDispatch implements Observer{ //观察者
	// 单例模式
	private final static EventDispatch dispatch = new EventDispatch(); 
	// 事件消费者
	private Vector<EventCustomer> customer = new Vector<EventCustomer>();
	
	// 不允许生成新的实例
	private EventDispatch(){
		
	}
	
	// 获得单例对象
	public static EventDispatch getEventDispathc(){
		return dispatch;
	}

	/**
	 * 事件触发
	 *
	 * ProductEvent类调用 super.notifyObservers() 在 Observable#notifyObservers() 中 调用 update() 方法：
	 *    public void notifyObservers(Object arg) {
	 *         ......
	 *         for (int i = arrLocal.length-1; i>=0; i--)
	 *             ((Observer)arrLocal[i]).update(this, arg);
	 *    }
	 * @param o 被观察者事件
	 * @param arg 产品
	 */
	@Override
	public void update(Observable o, Object arg) {
		// 事件的源头
		Product product = (Product) arg;
		// 事件
		ProductEvent event = (ProductEvent) o;
	
		// 处理者处理，这里是中介者模式的核心，可以是很复杂的业务逻辑
		for(EventCustomer e:customer){			
			// 处理能力是否匹配
			for(EventCustomType t:e.getCustomType()){				
				if(t.getValue() == event.getEventType().getValue()){
					e.exec(event);
				}					
			}

		}
	}

	// 注册事件处理者
	public void registerCustomer(EventCustomer _customer){
		customer.add(_customer);
	}
}

